Skip to content

feat: add copyable message citation links - #128

Closed
PollyBot13 wants to merge 9 commits into
openclaw:mainfrom
PollyBot13:feat/message-citations
Closed

feat: add copyable message citation links#128
PollyBot13 wants to merge 9 commits into
openclaw:mainfrom
PollyBot13:feat/message-citations

Conversation

@PollyBot13

@PollyBot13 PollyBot13 commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Closes #127

What Problem This Solves

Users and agents can find messages inside ClickClack, but cannot copy a stable, permission-checked link back to a channel message. Decisions and evidence therefore have to be referenced with copied text or vague navigation instructions.

Why This Change Was Made

Channel root messages now receive immutable public M... route IDs at creation or migration, while replies and new DM citation actions remain out of scope. Desktop and touch action surfaces copy one canonical absolute URL using the configured public frontend origin. Before a first reply the route highlights the root in its channel; afterward the same URL opens the thread pane.

Clipboard denial exposes a focused, selected, read-only URL rather than losing the citation. Existing route authorization remains authoritative, so possession of a link grants no access.

Channel and DM roots retain separate persistence paths: CreateMessage is channel-only and assigns the eager citation identity, while CreateDirectMessage preserves the existing lazy DM-thread identity behavior.

The upgrade backfill respects the stores’ actual schema histories: SQLite keys off 0011_public_route_ids.sql, while PostgreSQL keys off its initial 0001_schema.sql. This makes the citation backfill run on existing PostgreSQL installations instead of silently skipping them.

User Impact

People and integrations can cite a durable ClickClack discussion with a copyable link that remains stable as the message becomes a thread. Links use public route IDs only and preserve current workspace, channel, guest, and message permissions. Existing SQLite and PostgreSQL stores receive the same channel-root citation behavior during migration.

Evidence

Exact reviewed head: 98044b55ba89a6fe2f49a928eb3ec8a7ea8ea2f6, based on main at 4843afe2e8eb6bcfeba947496feae3db72e6f659.

Built-server browser proof

The production web bundle was built into the Go server and exercised against a fresh real SQLite store:

CLICKCLACK_E2E_PORT=<loopback-port> \
  pnpm exec playwright test tests/e2e/message-citations.spec.ts \
  --workers=1 --reporter=list --trace=on

1 passed

The exact-head scenario proves desktop and touch copy actions, configured-origin handling, direct-route highlight before replies, the same route opening the thread after its first reply, replies remaining without independent route IDs, and the accessible selected-URL fallback after clipboard denial.

All refreshed screenshots were visually inspected for rendered state, readable controls, stable URL, and layout integrity.

Existing-store upgrade proof

Focused real-store tests passed:

CLICKCLACK_POSTGRES_TEST_DSN=<local PostgreSQL 17 DSN> \
  go test ./apps/api/internal/store/postgres \
  -run 'TestMigrateBackfillsLegacyChannelRootRouteIDs|TestMessageRouteIDCreationRespectsChannelAndDirectBoundaries' \
  -count=1

go test ./apps/api/internal/store/sqlite \
  -run 'TestMigrateBackfillsRouteIDsOnce|TestRouteIDBackfillAllChannelRoots' \
  -count=1

They prove that legacy workspace, channel, direct-conversation, and channel-root rows receive the expected routes; direct-message roots and replies remain uncited; and the one-time completion marker is recorded.

Broader validation

  • pnpm generate:sqlc — passed with no generated drift.
  • umask 0027; pnpm check — passed.
  • git diff --check origin/main...HEAD — passed.
  • Independent exact-diff local Codex review — no correctness, security, or maintainability findings.
  • Hosted checks are rerunning for this head.

AI-assisted development: yes (Codex); all generated changes were reviewed and validated against the exact head above.

@PollyBot13

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Exact head 661fe3143a64409a6716927ca97cee987e2397ce has all seven hosted checks green. The PR includes inspectable built-server/browser screenshots and reproduction covering desktop and touch copy, configured public origin, pre-reply highlight, stable first-reply routing, and clipboard-denial fallback. Full local checks, real PostgreSQL coverage, and an independent exact-head Codex review found no actionable regressions.

@clawsweeper

clawsweeper Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. labels Jul 25, 2026
@clawsweeper

clawsweeper Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed August 2, 2026, 3:13 AM ET / 07:13 UTC.

ClawSweeper review

What this changes

This PR gives channel-root messages stable public citation URLs, backfills eligible existing SQLite and PostgreSQL messages, and adds desktop and touch copy-link actions with an accessible clipboard-denial fallback.

Merge readiness

⚠️ Needs maintainer review before merge - 4 items remain

Keep this PR open: the previous P1 blocker remains on the unchanged reviewed head. Expanding the migration to every historical channel root performs an unbounded read-then-one-update-per-row pass during startup; PostgreSQL retains its migration advisory lock for that entire interval, so a large existing deployment can be unavailable for an unbounded upgrade period.

Priority: P1
Reviewed head: 98044b55ba89a6fe2f49a928eb3ec8a7ea8ea2f6

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The user-visible proof is strong, but the unresolved startup availability defect prevents a merge-ready rating.
Proof confidence 🦞 diamond lobster (5/6) ✨ media proof bonus Sufficient (screenshot): Commit-pinned screenshots and the supplied exact-head built-server Playwright evidence directly show the copy action, stable route lifecycle, and selectable clipboard-denial fallback; redact private deployment details if additional proof is posted.
Patch quality 🦐 gold shrimp (3/6) 1 actionable review finding remain.

Verification

Check Result Evidence
Real behavior Verified Sufficient (screenshot): Commit-pinned screenshots and the supplied exact-head built-server Playwright evidence directly show the copy action, stable route lifecycle, and selectable clipboard-denial fallback; redact private deployment details if additional proof is posted.
Evidence reviewed 5 items Unbounded migration work: The changed predicate now selects every legacy channel root without a route ID. The shared helper materializes every matching ID and then performs one route-ID update per row, with no page size, duration limit, durable progress cursor, or set-based update.
PostgreSQL startup lock scope: PostgreSQL acquires its advisory migration lock before applying migrations and keeps it until after backfillRouteIDsOnce returns, so the unbounded pass is inside the serialized migration window.
Scale coverage is absent: The added PostgreSQL migration test verifies one legacy channel root and the completion marker, but does not exercise a large existing store, bounded work, resumability, or startup duration.
Findings 1 actionable finding [P1] Bound the startup citation backfill
Security None None.

How this fits together

ClickClack stores public route IDs separately from internal message IDs and resolves them through existing authorization checks. This PR assigns a stable route ID to each channel-root message, then the web client builds a canonical URL that opens and highlights the root or its thread.

flowchart LR
  A[Channel-root message] --> B[Store assigns public route ID]
  C[Existing SQLite or PostgreSQL data] --> D[Startup citation backfill]
  B --> E[Authorized route resolution]
  D --> E
  E --> F[Web client opens message or thread]
  F --> G[Copy-link action and fallback dialog]
Loading

Before merge

  • Bound the startup citation backfill (P1) - The changed predicate now selects every legacy channel root, but backfillTableRouteIDs loads all matching IDs and issues one update per row. Migrate waits for the entire pass, and PostgreSQL retains its advisory migration lock throughout it, so a large existing store can be unavailable for an unbounded upgrade interval. Make the work bounded and resumable, with scale coverage for both stores. This is the still-unfixed blocker from the prior review on the same head.
  • Resolve merge risk (P1) - Merging can make a large existing SQLite or PostgreSQL deployment spend an unbounded interval in startup migration work; PostgreSQL also serializes other migration attempts behind its advisory lock.
  • Resolve merge risk (P1) - GitHub currently reports the branch as conflicted with main; refresh and re-review the actual merge result after the bounded-backfill repair.
  • Complete next step (P2) - A focused repair can bound the two store backfills and add regression-scale coverage without changing the citation product contract.

Findings

  • [P1] Bound the startup citation backfill — apps/api/internal/store/postgres/route_ids.go:62-65
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Patch surface 54 files; 932 additions, 81 deletions The feature spans web UI, embedded assets, two persistent stores, documentation, and browser coverage, so migration safety is the merge-critical part.
Persistent-store coverage 2 stores changed SQLite and PostgreSQL both run the affected startup backfill and need the same bounded-upgrade guarantee.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #127
Summary: This PR is the explicitly linked candidate implementation for the remaining copyable channel-message citation feature tracked by the canonical issue.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge-risk options

Maintainer options:

  1. Make the citation backfill bounded (recommended)
    Replace the all-row startup pass with resumable bounded batches or an equivalent bounded set-based strategy, then prove both SQLite and PostgreSQL remain responsive through a large legacy-data upgrade.
  2. Pause the rollout
    Hold this branch until maintainers choose an upgrade strategy if bounded migration progress cannot be added without changing the store lifecycle contract.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Implement a bounded, durable legacy channel-root route-ID backfill for both stores; add scale and resume coverage, preserve route-ID and DM boundaries, and do not edit CHANGELOG.md.

Technical review

Best possible solution:

Backfill legacy channel roots in bounded, durable chunks that can resume without extending startup indefinitely, and add scale coverage for both stores before completing the citation rollout.

Do we have a high-confidence way to reproduce the issue?

Yes, source-reproducible: seed a large legacy store with route-less channel roots and run migration; the changed predicate selects all roots, then the helper retains all IDs and updates them serially. I did not execute that destructive-scale setup in this read-only review.

Is this the best way to solve the issue?

No: stable citations are a reasonable feature path, but the proposed eager all-history startup backfill is not a safe upgrade implementation until it is bounded and resumable.

Full review comments:

  • [P1] Bound the startup citation backfill — apps/api/internal/store/postgres/route_ids.go:62-65
    The changed predicate now selects every legacy channel root, but backfillTableRouteIDs loads all matching IDs and issues one update per row. Migrate waits for the entire pass, and PostgreSQL retains its advisory migration lock throughout it, so a large existing store can be unavailable for an unbounded upgrade interval. Make the work bounded and resumable, with scale coverage for both stores. This is the still-unfixed blocker from the prior review on the same head.
    Confidence: 0.98

Overall correctness: patch is incorrect
Overall confidence: 0.98

AGENTS.md: found, but no applicable review policy affected this item.

Codex review notes: model internal, reasoning high; reviewed against b8293987baa5.

Labels

Label justifications:

  • P1: A migration-time availability regression can block real existing deployments while they upgrade.
  • merge-risk: 🚨 availability: The changed all-channel-root predicate feeds a serial, unbounded startup backfill under PostgreSQL's migration advisory lock.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (screenshot): Commit-pinned screenshots and the supplied exact-head built-server Playwright evidence directly show the copy action, stable route lifecycle, and selectable clipboard-denial fallback; redact private deployment details if additional proof is posted.
  • proof: sufficient: Contributor real behavior proof is sufficient. Commit-pinned screenshots and the supplied exact-head built-server Playwright evidence directly show the copy action, stable route lifecycle, and selectable clipboard-denial fallback; redact private deployment details if additional proof is posted.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. Commit-pinned screenshots and the supplied exact-head built-server Playwright evidence directly show the copy action, stable route lifecycle, and selectable clipboard-denial fallback; redact private deployment details if additional proof is posted.

Evidence

Acceptance criteria:

  • [P1] go test ./apps/api/internal/store/sqlite -run 'TestMigrateBackfillsRouteIDsOnce|TestRouteIDBackfillAllChannelRoots' -count=1.
  • [P1] go test ./apps/api/internal/store/postgres -run 'TestMigrateBackfillsLegacyChannelRootRouteIDs|TestMessageRouteIDCreationRespectsChannelAndDirectBoundaries' -count=1.
  • [P1] Add and run focused large-legacy-store bounded/resume tests for both store implementations.
  • [P1] pnpm generate:sqlc if schema or query sources change.
  • [P1] pnpm check.

What I checked:

  • Unbounded migration work: The changed predicate now selects every legacy channel root without a route ID. The shared helper materializes every matching ID and then performs one route-ID update per row, with no page size, duration limit, durable progress cursor, or set-based update. (apps/api/internal/store/postgres/route_ids.go:62, 98044b55ba89)
  • PostgreSQL startup lock scope: PostgreSQL acquires its advisory migration lock before applying migrations and keeps it until after backfillRouteIDsOnce returns, so the unbounded pass is inside the serialized migration window. (apps/api/internal/store/postgres/postgres.go:60, 98044b55ba89)
  • Scale coverage is absent: The added PostgreSQL migration test verifies one legacy channel root and the completion marker, but does not exercise a large existing store, bounded work, resumability, or startup duration. (apps/api/internal/store/postgres/route_ids_test.go:12, 98044b55ba89)
  • Route-ID history: Current-main blame attributes the backfill helper to the public-route-ID work carried into the current tree by Shakker; repository history also identifies Peter Steinberger's PostgreSQL store introduction as adjacent ownership. (apps/api/internal/store/postgres/route_ids.go:48, 5000b7ef4295)
  • Real behavior proof: The prepared lifecycle screenshot visibly shows the Copy link action, stable URL before and after the first reply, route highlight/thread behavior, and the selected accessible clipboard fallback. The PR body also records a built-server Playwright run on the exact head. (docs/proof/message-citation-lifecycle.png, 98044b55ba89)

Likely related people:

  • Shakker: Current-main blame assigns the route-ID backfill implementation to this feature lineage, and history identifies the public route-ID feature work. (role: public route-ID feature contributor; confidence: high; commits: 376704a81238, 5000b7ef4295; files: apps/api/internal/store/postgres/route_ids.go, apps/api/internal/store/sqlite/route_ids.go)
  • Peter Steinberger: Repository history identifies the PostgreSQL store introduction, which owns the advisory-lock migration path affected by this finding. (role: PostgreSQL store contributor; confidence: medium; commits: 5531babaf667; files: apps/api/internal/store/postgres/postgres.go, apps/api/internal/store/postgres/route_ids.go)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Implement a bounded, resumable backfill for both stores.
  • Add a large legacy-store migration test that proves bounded progress and completion.
  • Rebase the repaired branch onto current main and refresh the merge result.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (30 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-01T09:34:35.883Z sha 98044b5 :: needs maintainer review before merge. :: none
  • reviewed 2026-08-01T11:27:17.822Z sha 98044b5 :: needs maintainer review before merge. :: none
  • reviewed 2026-08-01T12:51:43.044Z sha 98044b5 :: needs maintainer review before merge. :: none
  • reviewed 2026-08-01T14:52:49.090Z sha 98044b5 :: found issues before merge. :: [P1] Bound the startup citation backfill
  • reviewed 2026-08-01T17:34:08.699Z sha 98044b5 :: needs changes before merge. :: [P1] Bound the startup citation backfill
  • reviewed 2026-08-01T20:14:55.891Z sha 98044b5 :: found issues before merge. :: [P1] Bound the startup citation backfill
  • reviewed 2026-08-01T23:48:14.735Z sha 98044b5 :: needs changes before merge. :: [P1] Bound the startup citation backfill
  • reviewed 2026-08-02T05:08:52.761Z sha 98044b5 :: needs changes before merge. :: [P1] Bound the startup citation backfill

@PollyBot13

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Exact head: 1d15a6395ad00690da9c291050ec1fb194e3842c

The persistent-route finding was traced to a source-path misread rather than a
production defect:

  • CreateMessage accepts only ChannelID, calls InsertChannelMessage, and is
    the channel-root writer that eagerly assigns M...;
  • CreateDirectMessage accepts ConversationID, calls InsertDirectMessage,
    and has no eager route assignment; and
  • the pre-existing SQLite regression already asserted that a new DM root has no
    route until EnsureThreadRouteID is used.

This head adds equivalent real-PostgreSQL regression coverage for eager channel
roots, lazy DM roots, and compatible lazy DM-thread allocation. Both complete
store suites and the full repository gate pass.

The durable PR body now embeds commit-pinned raw screenshots directly and links
the exact-head reproduction plus both store regressions. The built production
bundle/browser proof was rerun on this head (1 passed) and the refreshed
screenshots were visually inspected.

@clawsweeper

clawsweeper Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. label Jul 25, 2026
@PollyBot13

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@PollyBot13

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jul 26, 2026
@PollyBot13

Copy link
Copy Markdown
Contributor Author

@codex review

@PollyBot13
PollyBot13 force-pushed the feat/message-citations branch from 31e7c72 to a990518 Compare July 29, 2026 18:23
@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 29, 2026
@PollyBot13

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Final head is 98044b55ba89a6fe2f49a928eb3ec8a7ea8ea2f6. The PostgreSQL historical-schema upgrade path now has real database coverage alongside SQLite, browser proof, pnpm check, and a clean final Codex review.

@clawsweeper

clawsweeper Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P1 Urgent regression or broken agent/channel workflow affecting real users now. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. labels Jul 29, 2026
@steipete

steipete commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Closing after maintainer review because the startup migration is not safe at production scale. It holds the PostgreSQL advisory migration lock while loading every legacy root into memory and then updating rows individually, so a large installation can block startup and deployment for an unbounded interval.

The durable design should assign route IDs lazily or use a bounded, resumable migration with explicit progress. That requires a fresh migration design rather than incremental edits to this branch. The product decision remains tracked in #127. Thanks for the thoughtful implementation work.

@steipete steipete closed this Aug 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. P1 Urgent regression or broken agent/channel workflow affecting real users now. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add copyable links for channel messages and thread roots

2 participants